﻿using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Windows.Controls;
using jSLCore.Client.Presentation.ApplicationContainer;
using jSLCore.Client.Presentation.BaseControl.DialogMessage;

namespace jSLCore.Client.Presentation.Authorization
{
    /// <summary>
    /// Контрол для авторизации пользователя
    /// </summary>
    public partial class AuthotizationControl : AuthorizationControlBase
    {
        private readonly ISecurityManager _securityManager;
        internal const string _rememberFileName = "remember0.jsl";

        public AuthotizationControl(ISecurityManager securityManager)
        {
            _securityManager = securityManager;
            InitializeComponent();
        }

        public override Control GetControlForInitialFocus()
        {
            return loginTxt;
        }

        public override void TryAuthorize()
        {
          DoWork("Авторизация",(sender, args) =>
                                   {
                                      args.Result = _securityManager.Authorize(args.String,(string) args.Params[1]);
                                   },(o, eventArgs) =>
                                                         {
                                                             if(eventArgs.Error==null)
                                                             {
                                                                 if(rememberMy.IsChecked.GetValueOrDefault(false))
                                                                            CheckRemember((Guid)eventArgs.Result);
                                                                 UserAuthorized();
                                                             }
                                                             else
                                                             {
                                                                 DeleteRemember();
                                                             }
                                                         },loginTxt.Text,pwdTxt.Password);
        }

        public static void DeleteRemember()
        {
            var store = IsolatedStorageFile.GetUserStoreForApplication();

            if(store.FileExists(_rememberFileName))
            {
                store.DeleteFile(_rememberFileName);
            }
        }

        public static Guid? GetRememberCode()
        {
             var store = IsolatedStorageFile.GetUserStoreForApplication();

             if (!store.FileExists(_rememberFileName)) return null;

            var stream = store.OpenFile(_rememberFileName,FileMode.Open);
            var bs = new byte[stream.Length];
            stream.Read(bs, 0, (int) stream.Length);

            var code = new Guid(bs);

            return code;
        }

        private void CheckRemember(Guid code)
        {
            if(rememberMy.IsChecked.GetValueOrDefault(false))
            {
                if(!IsolatedStorageFile.IsEnabled)
                {
                    ErrorBox.ShowDialog(@"'Функция запомнить меня не доступна'.Необходимо разрешить приложению хранение файлов. Попробуйте настроить браузер, нажав правой кнопкой мыши на приложение");
                    return;
                }
                var store = IsolatedStorageFile.GetUserStoreForApplication();

                var stream = store.OpenFile(_rememberFileName,FileMode.Create);
                var bs = code.ToByteArray();

                stream.Write(bs,0,bs.Length);
                stream.Close();
            }
        }

        /// <summary>
        /// Для потомков, позволяет потомкам установить свой контент. Например ссылку на регистрацию
        /// </summary>
        protected void SetCustomControl(object content)
        {
            customContent.Content = content;
        }

     
    }
}
